โšก Operazioni in Binario

Dalla somma semplice alle operazioni avanzate: complemento a 2, shift e operatori logici

๐Ÿ“š 1. Introduzione alle Operazioni Binarie

Le operazioni in binario sono fondamentali nell'informatica perchรฉ rappresentano ciรฒ che realmente avviene all'interno dei processori. Ogni operazione che eseguiamo sui computer viene tradotta in operazioni binarie a livello hardware.

๐Ÿ’ก Perchรฉ studiare le operazioni binarie?
  • Comprendere come funzionano realmente i computer
  • Ottimizzare il codice e capire la performance
  • Debugging a basso livello
  • Manipolazione di bit (maschere, flags, permessi)
  • Crittografia e sicurezza
  • Grafica e compressione dati

๐Ÿ“Š Tipi di operazioni che studieremo

Categoria Operazioni Complessitร 
Aritmetiche Base Addizione, Sottrazione, Moltiplicazione, Divisione โญ Facile
Numeri Negativi Complemento a 1, Complemento a 2 โญโญ Media
Operazioni Logiche AND, OR, XOR, NOT โญโญ Media
Shift e Rotazioni Shift logico, Shift aritmetico, Rotazioni โญโญโญ Avanzata

โž• 2. Addizione Binaria

L'addizione in binario segue le stesse regole dell'addizione decimale, ma รจ molto piรน semplice perchรฉ abbiamo solo due cifre (0 e 1).

๐Ÿ“‹ Regole dell'addizione binaria

๐Ÿ’ก Tabella di addizione binaria
A B Somma Riporto
0000
0110
1010
1101

Regola chiave: 1 + 1 = 10โ‚‚ (cioรจ 0 con riporto di 1)

๐ŸŽฏ Esempio passo-passo

Esempio: Addizione di 1011โ‚‚ + 1101โ‚‚

Riporti: ยน ยนยน ยน 1011 (11โ‚โ‚€) + 1101 (13โ‚โ‚€) -------- 11000 (24โ‚โ‚€) Passo per passo: Colonna 1 (da destra): 1 + 1 = 0, riporto 1 Colonna 2: 1 + 0 + riporto(1) = 0, riporto 1 Colonna 3: 0 + 1 + riporto(1) = 0, riporto 1 Colonna 4: 1 + 1 + riporto(1) = 1, riporto 1 Colonna 5: riporto(1) = 1
โš ๏ธ Overflow (traboccamento)

Quando si lavora con un numero fisso di bit, puรฒ verificarsi un overflow se il risultato รจ troppo grande per essere rappresentato.

Esempio con 4 bit: 1111 (15โ‚โ‚€) + 0001 (1โ‚โ‚€) -------- 10000 (16โ‚โ‚€) โ† Serve un 5ยฐ bit! In un sistema a 4 bit, il risultato sarebbe 0000 con flag di overflow.

๐Ÿ”ข Altri esempi

Esempio 1: Esempio 2: Esempio 3: 101 1110 10111 + 011 + 1011 + 1101 ------- -------- --------- 1000 11001 100100 (5+3=8) (14+11=25) (23+13=36)

โž– 3. Sottrazione Binaria

La sottrazione binaria puรฒ essere eseguita in due modi: direttamente (con prestito) o usando il complemento a 2 (trasformandola in addizione).

๐Ÿ“‹ Metodo 1: Sottrazione diretta

๐Ÿ’ก Regole della sottrazione binaria
A B A - B Prestito
0000
1010
1100
0111 (prendo in prestito)

Regola chiave: 0 - 1 richiede un prestito dalla cifra successiva

Esempio: Sottrazione di 1101โ‚‚ - 1011โ‚‚

Prestiti: ยน 1101 (13โ‚โ‚€) - 1011 (11โ‚โ‚€) -------- 0010 (2โ‚โ‚€) Passo per passo: Colonna 1: 1 - 1 = 0 Colonna 2: 0 - 1 = ? โ†’ Prendo in prestito: 10 - 1 = 1 Colonna 3: 1 - 0 - prestito(1) = 0 Colonna 4: 1 - 1 = 0

๐Ÿ“‹ Metodo 2: Complemento a 2 (preferito)

Il complemento a 2 รจ il metodo standard usato dai computer per rappresentare i numeri negativi e semplificare la sottrazione.

โœ… Perchรฉ usare il complemento a 2?
  • Semplifica l'hardware: serve solo un circuito sommatore
  • Non esistono problemi con lo zero (+0 e -0 sono uguali)
  • Range simmetrico di valori rappresentabili
  • Operazioni piรน veloci

๐Ÿ”„ 4. Complemento a 1 e Complemento a 2

๐Ÿ“‹ Complemento a 1

Il complemento a 1 si ottiene invertendo tutti i bit (0โ†’1, 1โ†’0).

Numero originale: 10110101 Complemento a 1: 01001010 โ† Tutti i bit invertiti

๐Ÿ“‹ Complemento a 2

Il complemento a 2 si ottiene calcolando il complemento a 1 e poi aggiungendo 1.

Esempio: Calcolare il complemento a 2 di 00101101โ‚‚

Passo 1 - Numero originale: 00101101 Passo 2 - Complemento a 1: 11010010 (inverti tutti i bit) Passo 3 - Aggiungi 1: 11010011 (complemento a 2) Verifica: 00101101โ‚‚ = 45โ‚โ‚€ 11010011โ‚‚ = -45โ‚โ‚€ in complemento a 2

๐ŸŽฏ Rappresentazione di numeri negativi

๐Ÿ’ก Come riconoscere numeri negativi

In un sistema a complemento a 2, il bit piรน significativo (MSB, il bit piรน a sinistra) indica il segno:

  • MSB = 0 โ†’ Numero positivo
  • MSB = 1 โ†’ Numero negativo

๐Ÿ“Š Range di valori con complemento a 2

Bit Range Esempio valori
4 bit da -8 a +7 1000โ‚‚ = -8, 0111โ‚‚ = +7
8 bit da -128 a +127 10000000โ‚‚ = -128, 01111111โ‚‚ = +127
16 bit da -32768 a +32767 1000000000000000โ‚‚ = -32768
32 bit da -2ยณยน a +2ยณยน-1 Circa ยฑ2.1 miliardi

๐ŸŽฏ Sottrazione usando il complemento a 2

Esempio: Calcolare 12โ‚โ‚€ - 5โ‚โ‚€ = 7โ‚โ‚€ usando 8 bit

Passo 1 - Converti in binario: 12โ‚โ‚€ = 00001100โ‚‚ 5โ‚โ‚€ = 00000101โ‚‚ Passo 2 - Calcola complemento a 2 di 5: 00000101 โ†’ 11111010 (complemento a 1) 11111011 (complemento a 2: +1) Passo 3 - Addiziona 12 + (-5): 00001100 (12) + 11111011 (-5) ------------ 1 00000111 (7) โ† Il riporto finale si ignora! Risultato: 00000111โ‚‚ = 7โ‚โ‚€ โœ“
โš ๏ธ Overflow nel complemento a 2

L'overflow si verifica quando:

  • Due numeri positivi danno un risultato negativo
  • Due numeri negativi danno un risultato positivo
Esempio overflow con 4 bit: 0110 (+6) 1010 (-6) + 0101 (+5) + 1001 (-7) -------- -------- 1011 (-5 โŒ) 0011 (+3 โŒ) Dovrebbe essere +11 Dovrebbe essere -13 Ma +11 non รจ rappresentabile in 4 bit signed!

โœ–๏ธ 5. Moltiplicazione Binaria

La moltiplicazione binaria รจ simile alla moltiplicazione decimale, ma molto piรน semplice perchรฉ ogni passo รจ o 0 (se moltiplichi per 0) o uguale al numero stesso (se moltiplichi per 1).

๐Ÿ“‹ Regole della moltiplicazione binaria

๐Ÿ’ก Tabella di moltiplicazione binaria
ร— 0 1
000
101

Esempio: Moltiplicazione di 1011โ‚‚ ร— 101โ‚‚

1011 (11โ‚โ‚€) ร— 101 (5โ‚โ‚€) -------- 1011 โ† 1011 ร— 1 0000 โ† 1011 ร— 0 (shift di 1) 1011 โ† 1011 ร— 1 (shift di 2) -------- 110111 (55โ‚โ‚€) Verifica: 11 ร— 5 = 55 โœ“

๐ŸŽฏ Algoritmo passo-passo

โœ… Procedura per moltiplicare in binario
  1. Scrivi i due numeri da moltiplicare
  2. Per ogni bit del moltiplicatore (dal basso):
    • Se il bit รจ 1: scrivi il moltiplicando
    • Se il bit รจ 0: scrivi tutti zeri
  3. Ogni riga successiva รจ spostata di una posizione a sinistra
  4. Somma tutte le righe

Altro esempio: 110โ‚‚ ร— 11โ‚‚

110 (6โ‚โ‚€) ร— 11 (3โ‚โ‚€) ----- 110 โ† 110 ร— 1 110 โ† 110 ร— 1 (shift di 1) ----- 10010 (18โ‚โ‚€) Verifica: 6 ร— 3 = 18 โœ“
๐Ÿ’ก Ottimizzazione: Moltiplicazione per potenze di 2

Moltiplicare per una potenza di 2 รจ semplicissimo: basta fare uno shift a sinistra!

1011โ‚‚ ร— 2 = 10110โ‚‚ (shift left di 1) 1011โ‚‚ ร— 4 = 101100โ‚‚ (shift left di 2) 1011โ‚‚ ร— 8 = 1011000โ‚‚ (shift left di 3)

โž— 6. Divisione Binaria

La divisione binaria segue lo stesso algoritmo della divisione decimale "in colonna", ma รจ piรน semplice perchรฉ ci si chiede solo se il divisore "ci sta" o "non ci sta".

Esempio: Divisione di 1101โ‚‚ รท 11โ‚‚

100 โ† Quoziente ----- 11 | 1101 โ† Dividendo (13โ‚โ‚€) 11 โ† 11 ci sta in 11 -- 01 โ† Resto parziale 0 โ† Abbasso lo 0 -- 01 โ† 11 non ci sta in 01 โ†’ scrivo 0 1 โ† Abbasso l'1 -- 11 โ† 11 ci sta in 11 โ†’ scrivo 1 11 -- 0 โ† Resto finale Risultato: 1101โ‚‚ รท 11โ‚‚ = 100โ‚‚ resto 0 Verifica: 13 รท 3 = 4 resto 1... ERRORE!

Esempio corretto: 1110โ‚‚ รท 11โ‚‚

100 โ† Quoziente ----- 11 | 1110 โ† Dividendo (14โ‚โ‚€) 11 -- 00 1 -- 01 0 -- 10 โ† 11 non ci sta in 10 -- Resto: 10โ‚‚ = 2โ‚โ‚€ Risultato: 1110โ‚‚ รท 11โ‚‚ = 100โ‚‚ resto 10โ‚‚ Verifica: 14 รท 3 = 4 resto 2 โœ“
๐Ÿ’ก Ottimizzazione: Divisione per potenze di 2

Dividere per una potenza di 2 รจ facile: basta fare uno shift a destra!

11010โ‚‚ รท 2 = 1101โ‚‚ (shift right di 1) 11010โ‚‚ รท 4 = 110โ‚‚ (shift right di 2) 11010โ‚‚ รท 8 = 11โ‚‚ (shift right di 3) Nota: i bit che "escono" a destra rappresentano il resto!

๐Ÿ”ฃ 7. Operatori Logici (Bitwise)

Gli operatori logici (o bitwise) operano su ogni singolo bit indipendentemente. Sono fondamentali nella programmazione per manipolare flag, permessi, maschere e ottimizzazioni.

๐Ÿ”ท Operatore AND (&)

๐Ÿ’ก AND - Entrambi devono essere 1
ABA AND B
000
010
100
111
Esempio AND: 10110101 & 11001100 ----------- 10000100 Uso comune: Mascherare bit (isolare bit specifici)

๐Ÿ”ถ Operatore OR (|)

๐Ÿ’ก OR - Almeno uno deve essere 1
ABA OR B
000
011
101
111
Esempio OR: 10110101 | 11001100 ----------- 11111101 Uso comune: Impostare bit (settare bit a 1)

๐Ÿ”ธ Operatore XOR (^)

๐Ÿ’ก XOR - Devono essere diversi
ABA XOR B
000
011
101
110
Esempio XOR: 10110101 ^ 11001100 ----------- 01111001 Uso comune: Toggle bit, cifratura semplice, confronti
โœ… Proprietร  interessanti di XOR
  • A ^ A = 0 (un numero XOR se stesso = 0)
  • A ^ 0 = A (un numero XOR 0 = se stesso)
  • A ^ B ^ B = A (proprietร  di cancellazione)
  • XOR รจ commutativo: A ^ B = B ^ A

๐Ÿ”น Operatore NOT (~)

๐Ÿ’ก NOT - Inverte tutti i bit
ANOT A
01
10
Esempio NOT: ~10110101 --------- 01001010 Uso comune: Complemento a 1, inversione maschere

๐ŸŽฏ Applicazioni pratiche degli operatori logici

Esempio 1: Verificare se il bit N รจ impostato

Numero: 10110101 Maschera: 00000100 (bit 2) --------- AND: 00000100 โ† Se risultato โ‰  0, il bit รจ impostato In Python: if (numero & (1 << N)) != 0:

Esempio 2: Impostare il bit N a 1

Numero: 10110101 Maschera: 00001000 (bit 3) --------- OR: 10111101 โ† Bit 3 ora รจ 1 In Python: numero = numero | (1 << N)

Esempio 3: Azzerare il bit N

Numero: 10110101 Maschera: 11111011 (~(1 << 2)) --------- AND: 10110001 โ† Bit 2 ora รจ 0 In Python: numero = numero & ~(1 << N)

Esempio 4: Toggle (invertire) il bit N

Numero: 10110101 Maschera: 00000100 (bit 2) --------- XOR: 10110001 โ† Bit 2 invertito In Python: numero = numero ^ (1 << N)

โ†”๏ธ 8. Operazioni di Shift e Rotazione

Le operazioni di shift (spostamento) sono fondamentali per moltiplicare/dividere velocemente per potenze di 2 e manipolare dati.

โ—€๏ธ Shift Logico a Sinistra (Left Shift)

๐Ÿ’ก Left Shift (<<)

Sposta tutti i bit a sinistra, riempiendo con 0 a destra. Equivale a moltiplicare per 2.

Originale: 00101101 (45โ‚โ‚€) Left shift di 1: 01011010 (90โ‚โ‚€) โ† ร— 2 Left shift di 2: 10110100 (180โ‚โ‚€) โ† ร— 4 Left shift di 3: 01101000 (104โ‚โ‚€) โ† ร— 8 (overflow!)
โš ๏ธ Attenzione all'overflow

I bit che "escono" a sinistra vengono persi! Questo puรฒ causare risultati inaspettati.

โ–ถ๏ธ Shift Logico a Destra (Right Shift)

๐Ÿ’ก Right Shift Logico (>> o >>>)

Sposta tutti i bit a destra, riempiendo con 0 a sinistra. Equivale a dividere per 2 (troncando).

Originale: 00101101 (45โ‚โ‚€) Right shift di 1: 00010110 (22โ‚โ‚€) โ† รท 2 Right shift di 2: 00001011 (11โ‚โ‚€) โ† รท 4 Right shift di 3: 00000101 (5โ‚โ‚€) โ† รท 8

๐Ÿ”ฝ Shift Aritmetico a Destra

๐Ÿ’ก Arithmetic Right Shift

Come lo shift logico, ma mantiene il bit di segno (copia il MSB). Usato per dividere numeri con segno mantenendo il segno corretto.

Numero positivo: Originale: 01011010 (+90โ‚โ‚€) Arith shift: 00101101 (+45โ‚โ‚€) โœ“ Numero negativo: Originale: 11010110 (-42โ‚โ‚€ in complemento a 2) Arith shift: 11101011 (-21โ‚โ‚€) โœ“ Mantiene il segno!

๐Ÿ”„ Rotazioni (Rotate)

๐Ÿ’ก Rotate Left (ROL) e Rotate Right (ROR)

Nelle rotazioni, i bit che "escono" da un lato rientrano dall'altro. Nessun bit viene perso!

Rotate Left (ROL): Originale: 10110101 ROL di 1: 01110110 โ† Il bit 1 uscito a sx rientra a dx ROL di 2: 11011010 ROL di 3: 10110101 โ† Torna uguale dopo 8 rotazioni! Rotate Right (ROR): Originale: 10110101 ROR di 1: 11011010 โ† Il bit 1 uscito a dx rientra a sx ROR di 2: 01101101
โœ… Confronto Shift vs Rotazione
Operazione Bit persi? Riempimento Uso
Shift Logico Sรฌ Con 0 Moltiplicazione/divisione per 2โฟ
Shift Aritmetico Sรฌ Con bit di segno Divisione numeri con segno
Rotazione No Con bit che escono Crittografia, hashing

๐Ÿงฎ 9. Calcolatore Binario Interattivo

Usa questo strumento per esercitarti con tutte le operazioni binarie!

๐Ÿ”ข Calcolatore Operazioni Binarie

๐ŸŽฏ Operazioni Unarie

Operazioni su un solo numero

๐Ÿ“ 10. Esercizi Pratici

๐ŸŽฒ Generatore di Esercizi

๐ŸŽฏ 11. Trucchi e Ottimizzazioni

โœ… Trucco 1: Verificare se un numero รจ potenza di 2
Un numero รจ potenza di 2 se ha solo un bit a 1. Trucco: n & (n-1) == 0 Esempi: 8โ‚โ‚€ = 1000โ‚‚ โ†’ 1000 & 0111 = 0000 โœ“ (รจ potenza di 2) 6โ‚โ‚€ = 0110โ‚‚ โ†’ 0110 & 0101 = 0100 โœ— (non รจ potenza di 2) 16โ‚โ‚€ = 10000โ‚‚ โ†’ 10000 & 01111 = 00000 โœ“
โœ… Trucco 2: Scambiare due numeri senza variabile temporanea
Usa tre XOR: a = 1010 b = 0101 a = a ^ b โ†’ a = 1111 b = a ^ b โ†’ b = 1010 (ora b ha il vecchio valore di a!) a = a ^ b โ†’ a = 0101 (ora a ha il vecchio valore di b!) Risultato: a e b scambiati!
โœ… Trucco 3: Contare i bit a 1 (popcount)
Metodo semplice (ripeti fino a n = 0): count = 0 while n != 0: count += n & 1 # Controlla ultimo bit n >>= 1 # Shift right Trucco veloce (Brian Kernighan): count = 0 while n != 0: n = n & (n-1) # Rimuove il bit 1 piรน a destra count += 1
โœ… Trucco 4: Trovare il bit meno significativo a 1
Usa: n & (-n) Esempio: n = 10110100 -n = 01001100 (complemento a 2) n & (-n) = 00000100 โ† Isola il bit piรน a destra!
โœ… Trucco 5: Verificare se due numeri hanno segno opposto
Usa: (x ^ y) < 0 Se XOR รจ negativo (MSB = 1), i segni sono opposti. Esempio: 0011 ( 3) ^ 1101 (-3) = 1110 (negativo) โœ“ Segni opposti 0011 ( 3) ^ 0101 ( 5) = 0110 (positivo) โœ“ Stesso segno

โš ๏ธ 12. Errori Comuni da Evitare

โŒ Errore 1: Dimenticare l'overflow

Problema: Sommare senza considerare il numero di bit disponibili
Soluzione: Controlla sempre se il risultato "ci sta" nel numero di bit che hai

โŒ Errore 2: Confondere shift logico e aritmetico

Problema: Usare shift logico su numeri con segno
Soluzione: Per numeri negativi usa shift aritmetico per mantenere il segno

โŒ Errore 3: Dimenticare che XOR รจ reversibile

Problema: Non sfruttare A ^ B ^ B = A
Soluzione: Usa questa proprietร  per cifratura semplice e ottimizzazioni

โŒ Errore 4: Sbagliare la precedenza degli operatori

Problema: In molti linguaggi, & e | hanno precedenza bassa
Soluzione: Usa sempre le parentesi: if ((x & mask) != 0)

โŒ Errore 5: Non allineare i bit nelle operazioni

Problema: Confrontare numeri con lunghezze diverse
Soluzione: Estendi con zeri a sinistra per allineare

โœ… 13. Checklist di Autovalutazione

๐Ÿ“‹ Prima di considerarti pronto, verifica di saper:
  • โ˜ Eseguire addizioni binarie con riporto
  • โ˜ Eseguire sottrazioni binarie con prestito
  • โ˜ Calcolare il complemento a 1 e il complemento a 2
  • โ˜ Rappresentare numeri negativi in complemento a 2
  • โ˜ Riconoscere e gestire l'overflow
  • โ˜ Moltiplicare numeri binari
  • โ˜ Dividere numeri binari
  • โ˜ Usare AND, OR, XOR, NOT correttamente
  • โ˜ Distinguere shift logico e shift aritmetico
  • โ˜ Capire la differenza tra shift e rotazione
  • โ˜ Applicare operatori bitwise per mascherare bit
  • โ˜ Riconoscere quando usare shift invece di moltiplicazione/divisione
  • โ˜ Usare i trucchi per verificare potenze di 2
  • โ˜ Contare i bit a 1 in un numero

๐ŸŽ“ Conclusione

Congratulazioni! Hai completato questa guida completa sulle operazioni binarie. Ora conosci le basi dell'aritmetica che i processori eseguono milioni di volte al secondo!

Usa il calcolatore interattivo per esercitarti regolarmente. La pratica รจ fondamentale per padroneggiare queste operazioni! ๐Ÿ’ช

"Ci sono 10 tipi di persone al mondo: quelli che capiscono il binario e quelli che non lo capiscono." ๐Ÿ˜„